home *** CD-ROM | disk | FTP | other *** search
/ Gamers Delight 2 / Gamers Delight 2.iso / Aminet / game / role / Ang261Lib.lha / src / scrolls.c < prev    next >
C/C++ Source or Header  |  1994-10-22  |  12KB  |  458 lines

  1. /*
  2.  * scrolls.c: scroll code 
  3.  *
  4.  * Copyright (c) 1989 James E. Wilson, Robert A. Koeneke 
  5.  *
  6.  * This software may be copied and distributed for educational, research, and
  7.  * not for profit purposes provided that this copyright and statement are
  8.  * included in all such copies. 
  9.  */
  10.  
  11. #include "constant.h"
  12. #include "monster.h"
  13. #include "config.h"
  14. #include "types.h"
  15. #include "externs.h"
  16.  
  17. #ifdef USG
  18. #include <string.h>
  19. #else
  20. #include <strings.h>
  21. #endif
  22.  
  23. /* Scrolls for the reading                -RAK-     */
  24. void 
  25. read_scroll()
  26. {
  27.     int32u                i;
  28.     int                   j, k, item_val, y, x;
  29.     int                   tmp[6], used_up;
  30.     bigvtype              out_val, tmp_str;
  31.     register int          ident, l;
  32.     register inven_type  *i_ptr;
  33.     register struct misc *m_ptr;
  34.  
  35.     free_turn_flag = TRUE;
  36.     if (py.flags.blind > 0)
  37.     msg_print("You can't see to read the scroll.");
  38.     else if (no_light())
  39.     msg_print("You have no light to read by.");
  40.     else if (py.flags.confused > 0)
  41.     msg_print("You are too confused to read a scroll.");
  42.     else if (inven_ctr == 0)
  43.     msg_print("You are not carrying anything!");
  44.     else if (!find_range(TV_SCROLL1, TV_SCROLL2, &j, &k))
  45.     msg_print("You are not carrying any scrolls!");
  46.     else if (get_item(&item_val, "Read which scroll?", j, k, 0)) {
  47.     i_ptr = &inventory[item_val];
  48.     free_turn_flag = FALSE;
  49.     used_up = TRUE;
  50.     i = i_ptr->flags;
  51.     ident = FALSE;
  52.  
  53.     while (i != 0) {
  54.         j = bit_pos(&i) + 1;
  55.         if (i_ptr->tval == TV_SCROLL2)
  56.         j += 32;
  57.  
  58.     /* Scrolls.             */
  59.         switch (j) {
  60.           case 1:
  61.         i_ptr = &inventory[INVEN_WIELD];
  62.         if (i_ptr->tval != TV_NOTHING) {
  63.             objdes(tmp_str, i_ptr, FALSE);
  64.             (void) sprintf(out_val, "Your %s glows faintly! ", tmp_str);
  65.             msg_print(out_val);
  66.             if (!enchant(i_ptr, 1, ENCH_TOHIT))
  67.             msg_print("The enchantment fails. ");
  68.             ident = TRUE;
  69.         }
  70.         break;
  71.           case 2:
  72.         i_ptr = &inventory[INVEN_WIELD];
  73.         if (i_ptr->tval != TV_NOTHING) {
  74.             objdes(tmp_str, i_ptr, FALSE);
  75.             (void) sprintf(out_val, "Your %s glows faintly! ", tmp_str);
  76.             msg_print(out_val);
  77.             if (!enchant(i_ptr, 1, ENCH_TODAM))
  78.             msg_print("The enchantment fails. ");
  79.             ident = TRUE;
  80.         }
  81.         break;        
  82.           case 3:
  83.         k = 0;
  84.         l = 0;
  85.         if (inventory[INVEN_BODY].tval != TV_NOTHING)
  86.             tmp[k++] = INVEN_BODY;
  87.         if (inventory[INVEN_ARM].tval != TV_NOTHING)
  88.             tmp[k++] = INVEN_ARM;
  89.         if (inventory[INVEN_OUTER].tval != TV_NOTHING)
  90.             tmp[k++] = INVEN_OUTER;
  91.         if (inventory[INVEN_HANDS].tval != TV_NOTHING)
  92.             tmp[k++] = INVEN_HANDS;
  93.         if (inventory[INVEN_HEAD].tval != TV_NOTHING)
  94.             tmp[k++] = INVEN_HEAD;
  95.         /* also enchant boots */
  96.         if (inventory[INVEN_FEET].tval != TV_NOTHING)
  97.             tmp[k++] = INVEN_FEET;
  98.  
  99.         if (k > 0)
  100.             l = tmp[randint(k) - 1];
  101.         if (TR_CURSED & inventory[INVEN_BODY].flags)
  102.             l = INVEN_BODY;
  103.         else if (TR_CURSED & inventory[INVEN_ARM].flags)
  104.             l = INVEN_ARM;
  105.         else if (TR_CURSED & inventory[INVEN_OUTER].flags)
  106.             l = INVEN_OUTER;
  107.         else if (TR_CURSED & inventory[INVEN_HEAD].flags)
  108.             l = INVEN_HEAD;
  109.         else if (TR_CURSED & inventory[INVEN_HANDS].flags)
  110.             l = INVEN_HANDS;
  111.         else if (TR_CURSED & inventory[INVEN_FEET].flags)
  112.             l = INVEN_FEET;
  113.  
  114.         if (l > 0) {
  115.             i_ptr = &inventory[l];
  116.             objdes(tmp_str, i_ptr, FALSE);
  117.             (void) sprintf(out_val, "Your %s glows faintly! ", tmp_str);
  118.             msg_print(out_val);
  119.             if (!enchant(i_ptr, 1, ENCH_TOAC))
  120.             msg_print("The enchantment fails. ");
  121.             ident = TRUE;
  122.         }
  123.         break;
  124.         
  125.           case 4:
  126.         msg_print("This is an identify scroll.");
  127.         ident = TRUE;
  128.         used_up = ident_spell();
  129.  
  130.         /* The identify may merge objects, causing the identify scroll to
  131.          * move to a different place.  Check for that here.  It can
  132.          * move arbitrarily far if an identify scroll was used on another
  133.          * identify scroll, but it always moves down. 
  134.          */
  135.         while (i_ptr->tval != TV_SCROLL1 || i_ptr->flags != 0x00000008) {
  136.             item_val--;
  137.             i_ptr = &inventory[item_val];
  138.         }
  139.         break;
  140.           case 5:
  141.         if (remove_curse()) {
  142.             msg_print("You feel as if someone is watching over you.");
  143.             ident = TRUE;
  144.         }
  145.         break;
  146.           case 6:
  147.         ident = light_area(char_row, char_col, damroll(2, 12), 2);
  148.         break;
  149.           case 7:
  150.         for (k = 0; k < randint(3); k++) {
  151.             y = char_row;
  152.             x = char_col;
  153.             ident |= summon_monster(&y, &x, FALSE);
  154.         }
  155.         break;
  156.           case 8:
  157.         teleport(10);
  158.         ident = TRUE;
  159.         break;
  160.           case 9:
  161.         teleport(100);
  162.         ident = TRUE;
  163.         break;
  164.           case 10:
  165.         (void)tele_level();
  166.         ident = TRUE;
  167.         break;
  168.           case 11:
  169.         if (py.flags.confuse_monster == 0) {
  170.             msg_print("Your hands begin to glow.");
  171.             py.flags.confuse_monster = TRUE;
  172.             ident = TRUE;
  173.         }
  174.         break;
  175.           case 12:
  176.         ident = TRUE;
  177.         map_area();
  178.         break;
  179.           case 13:
  180.         ident = sleep_monsters1(char_row, char_col);
  181.         break;
  182.           case 14:
  183.         ident = TRUE;
  184.         warding_glyph();
  185.         break;
  186.           case 15:
  187.         ident = detect_treasure();
  188.         break;
  189.           case 16:
  190.         ident = detect_object();
  191.         break;
  192.           case 17:
  193.         ident = detect_trap();
  194.         break;
  195.           case 18:
  196.         ident = detect_sdoor();
  197.         break;
  198.           case 19:
  199.         msg_print("This is a mass genocide scroll.");
  200.         mass_genocide(TRUE);
  201.         ident = TRUE;
  202.         break;
  203.           case 20:
  204.         ident = detect_invisible();
  205.         break;
  206.           case 21:
  207.         ident = aggravate_monster(20);
  208.         if (ident)
  209.             msg_print("There is a high pitched humming noise.");
  210.         break;
  211.           case 22:
  212.         ident = trap_creation();
  213.         break;
  214.           case 23:
  215.         ident = td_destroy();
  216.         break;
  217.           case 24:           /* Not Used , used to be door creation */
  218.         break;
  219.           case 25:
  220.         msg_print("This is a Recharge-Item scroll.");
  221.         ident = TRUE;
  222.         used_up = recharge(60);
  223.         break;
  224.           case 26:
  225.         msg_print("This is a genocide scroll.");
  226.         genocide(TRUE);
  227.         ident = TRUE;
  228.         break;
  229.           case 27:
  230.         ident = unlight_area(char_row, char_col);
  231.         if (!py.flags.blindness_resist)
  232.             py.flags.blind += 3 + randint(5);
  233.         break;
  234.           case 28:
  235.         ident = protect_evil();
  236.         break;
  237.           case 29:
  238.         ident = TRUE;
  239.         create_food();
  240.         break;
  241.           case 30:
  242.         ident = dispel_creature(UNDEAD, 60);
  243.         break;
  244.           case 31:
  245.         remove_all_curse();
  246.         ident = TRUE;
  247.         break;
  248.           case 33:
  249.         i_ptr = &inventory[INVEN_WIELD];
  250.         if (i_ptr->tval != TV_NOTHING) {
  251.             objdes(tmp_str, i_ptr, FALSE);
  252.             (void) sprintf(out_val, "Your %s glows brightly!", tmp_str);
  253.             msg_print(out_val);
  254.             if (!enchant(i_ptr, randint(3), ENCH_TOHIT|ENCH_TODAM))
  255.             msg_print("The enchantment fails.");
  256.             ident = TRUE;
  257.         }
  258.         break;
  259.         
  260.           case 34:
  261.         i_ptr = &inventory[INVEN_WIELD];
  262.         if (i_ptr->tval != TV_NOTHING) {
  263.             objdes(tmp_str, i_ptr, FALSE);
  264.             if ((i_ptr->flags2 & TR_ARTIFACT) && (randint(7) < 4)) {
  265.         msg_print("A terrible black aura tries to surround your weapon,");
  266.         (void)sprintf(out_val, "but your %s resists the effects!", tmp_str);
  267.             msg_print(out_val);
  268.             } else {       /* not artifact or failed save... */
  269.         (void)sprintf(out_val, "A terrible black aura blasts your %s!", tmp_str);
  270.             msg_print(out_val);
  271.             py_bonuses(i_ptr, -1);    /* take off current bonuses -CFT */
  272.             i_ptr->name2 = SN_SHATTERED;
  273.             i_ptr->tohit = (-randint(5) - randint(5));
  274.             i_ptr->todam = (-randint(5) - randint(5));
  275.             i_ptr->flags = TR_CURSED;
  276.             i_ptr->flags2 = 0;
  277.             i_ptr->damage[0] = i_ptr->damage[1] = 1;
  278.             i_ptr->toac = 0;    /* in case defender... */
  279.             i_ptr->cost = (-1);
  280.             py_bonuses(i_ptr, 1);    /* now apply new "bonuses"
  281.                          * -CFT */
  282.             calc_bonuses();
  283.             }
  284.             ident = TRUE;  /* even if artifact makes save... */
  285.         }
  286.         break;
  287.           case 35:
  288.         k = 0;
  289.         l = 0;
  290.         if (inventory[INVEN_BODY].tval != TV_NOTHING)
  291.             tmp[k++] = INVEN_BODY;
  292.         if (inventory[INVEN_ARM].tval != TV_NOTHING)
  293.             tmp[k++] = INVEN_ARM;
  294.         if (inventory[INVEN_OUTER].tval != TV_NOTHING)
  295.             tmp[k++] = INVEN_OUTER;
  296.         if (inventory[INVEN_HANDS].tval != TV_NOTHING)
  297.             tmp[k++] = INVEN_HANDS;
  298.         if (inventory[INVEN_HEAD].tval != TV_NOTHING)
  299.             tmp[k++] = INVEN_HEAD;
  300.         /* also enchant boots */
  301.         if (inventory[INVEN_FEET].tval != TV_NOTHING)
  302.             tmp[k++] = INVEN_FEET;
  303.  
  304.         if (k > 0)
  305.             l = tmp[randint(k) - 1];
  306.         if (TR_CURSED & inventory[INVEN_BODY].flags)
  307.             l = INVEN_BODY;
  308.         else if (TR_CURSED & inventory[INVEN_ARM].flags)
  309.             l = INVEN_ARM;
  310.         else if (TR_CURSED & inventory[INVEN_OUTER].flags)
  311.             l = INVEN_OUTER;
  312.         else if (TR_CURSED & inventory[INVEN_HEAD].flags)
  313.             l = INVEN_HEAD;
  314.         else if (TR_CURSED & inventory[INVEN_HANDS].flags)
  315.             l = INVEN_HANDS;
  316.         else if (TR_CURSED & inventory[INVEN_FEET].flags)
  317.             l = INVEN_FEET;
  318.  
  319.         if (l > 0) {
  320.             i_ptr = &inventory[l];
  321.             objdes(tmp_str, i_ptr, FALSE);
  322.             (void) sprintf(out_val,"Your %s glows brightly!", tmp_str);
  323.             msg_print(out_val);
  324.             if (!enchant(i_ptr, randint(3)+1, ENCH_TOAC))
  325.             msg_print("The enchantment fails.");
  326.             ident = TRUE;
  327.         }
  328.         break;
  329.           case 36:
  330.         if ((inventory[INVEN_BODY].tval != TV_NOTHING)
  331.             && (randint(4) == 1))
  332.             k = INVEN_BODY;
  333.         else if ((inventory[INVEN_ARM].tval != TV_NOTHING)
  334.              && (randint(3) == 1))
  335.             k = INVEN_ARM;
  336.         else if ((inventory[INVEN_OUTER].tval != TV_NOTHING)
  337.              && (randint(3) == 1))
  338.             k = INVEN_OUTER;
  339.         else if ((inventory[INVEN_HEAD].tval != TV_NOTHING)
  340.              && (randint(3) == 1))
  341.             k = INVEN_HEAD;
  342.         else if ((inventory[INVEN_HANDS].tval != TV_NOTHING)
  343.              && (randint(3) == 1))
  344.             k = INVEN_HANDS;
  345.         else if ((inventory[INVEN_FEET].tval != TV_NOTHING)
  346.              && (randint(3) == 1))
  347.             k = INVEN_FEET;
  348.         else if (inventory[INVEN_BODY].tval != TV_NOTHING)
  349.             k = INVEN_BODY;
  350.         else if (inventory[INVEN_ARM].tval != TV_NOTHING)
  351.             k = INVEN_ARM;
  352.         else if (inventory[INVEN_OUTER].tval != TV_NOTHING)
  353.             k = INVEN_OUTER;
  354.         else if (inventory[INVEN_HEAD].tval != TV_NOTHING)
  355.             k = INVEN_HEAD;
  356.         else if (inventory[INVEN_HANDS].tval != TV_NOTHING)
  357.             k = INVEN_HANDS;
  358.         else if (inventory[INVEN_FEET].tval != TV_NOTHING)
  359.             k = INVEN_FEET;
  360.         else
  361.             k = 0;
  362.  
  363.         if (k > 0) {
  364.             i_ptr = &inventory[k];
  365.             objdes(tmp_str, i_ptr, FALSE);
  366.             if ((i_ptr->flags2 & TR_ARTIFACT) && (randint(7) < 4)) {
  367.             msg_print("A terrible black aura tries to surround your");
  368.         (void)sprintf(out_val, "%s, but it resists the effects!", tmp_str);
  369.             msg_print(out_val);
  370.             } else {       /* not artifact or failed save... */
  371.         (void)sprintf(out_val, "A terrible black aura blasts your %s!", tmp_str);
  372.             msg_print(out_val);
  373.             py_bonuses(i_ptr, -1);    /* take off current bonuses -CFT */
  374.             i_ptr->name2 = SN_BLASTED;
  375.             i_ptr->flags = TR_CURSED;
  376.             i_ptr->flags2 = 0;
  377.             i_ptr->toac = (-randint(5) - randint(5));
  378.             i_ptr->tohit = i_ptr->todam = 0; /* in case gaunlets of
  379.                              * slaying... */
  380.             i_ptr->ac = (i_ptr->ac > 9) ? 1 : 0;
  381.             i_ptr->cost = (-1);
  382.             py_bonuses(i_ptr, 1);    /* now apply new "bonuses"
  383.                          * -CFT */
  384.             calc_bonuses();
  385.             }
  386.             ident = TRUE;  /* even if artifact makes save... */
  387.         }
  388.         break;
  389.           case 37:
  390.         ident = FALSE;
  391.         for (k = 0; k < randint(3); k++) {
  392.             y = char_row;
  393.             x = char_col;
  394.             ident |= summon_undead(&y, &x);
  395.         }
  396.         break;
  397.           case 38:
  398.         ident = TRUE;
  399.         bless(randint(12) + 6);
  400.         break;
  401.           case 39:
  402.         ident = TRUE;
  403.         bless(randint(24) + 12);
  404.         break;
  405.           case 40:
  406.         ident = TRUE;
  407.         bless(randint(48) + 24);
  408.         break;
  409.           case 41:
  410.         ident = TRUE;
  411.         if (py.flags.word_recall == 0) {
  412.             py.flags.word_recall = 15 + randint(20);
  413.             msg_print("The air about you becomes charged...");
  414.         } else {
  415.             py.flags.word_recall = 0;
  416.             msg_print("A tension leaves the air around you...");
  417.         }
  418.         break;
  419.           case 42:
  420.         destroy_area(char_row, char_col);
  421.         ident = TRUE;
  422.         break;
  423.           case 43:
  424.         place_special(char_row, char_col, SPECIAL);
  425.         ident = TRUE;
  426.         prt_map();
  427.         break;
  428.           case 44:
  429.         special_random_object(char_row, char_col, 1);
  430.         ident = TRUE;
  431.         prt_map();
  432.         break;
  433.           default:
  434.         msg_print("Internal error in scroll()");
  435.         break;
  436.         }
  437.     /* End of Scrolls.                   */
  438.     }
  439.     i_ptr = &inventory[item_val];
  440.     if (ident) {
  441.         if (!known1_p(i_ptr)) {
  442.         m_ptr = &py.misc;
  443.         /* round half-way case up */
  444.         m_ptr->exp += (i_ptr->level + (m_ptr->lev >> 1)) / m_ptr->lev;
  445.         prt_experience();
  446.  
  447.         identify(&item_val);
  448.         i_ptr = &inventory[item_val];
  449.         }
  450.     } else if (!known1_p(i_ptr))
  451.         sample(i_ptr);
  452.     if (used_up) {
  453.         desc_remain(item_val);
  454.         inven_destroy(item_val);
  455.     }
  456.     }
  457. }
  458.